#ifndef __LoadControlledObject_H__
#define __LoadControlledObject_H__

#include "PositionObject.h"
#include <IReferenceCounted.h>
#include <LoadableInterface.h>
#include <exception/Null.h>
#include "LoadController.h"
#include "LoadableInterface.h"
/**
 * @class LoadControlledObject
 * Класс, который должен стать наследником для тех объектов, чей статус загрузгрузки/выгрузки нужно отслеживать и тех у которых есть позиция
 * */
class LoadControlledObject:public virtual irr::LoadableInterface,public virtual irr::object::PositionObject,public virtual irr::IReferenceCounted{
private:
	LoadController*control;
protected:
	LoadController*getController(){
		return control;
	}
public:
	virtual irr::f32 getRadiusObjectSize()=0;

	/***
	 * Добовляет себя в контролер статусов загрузки как объект, за статусом и удалённостью которого требуется следить
	 *
	 * @param controller контролер, который будет следить за данным объектом
	 * */
	LoadControlledObject(LoadController*controller){
		//CHECKNULL(controller);
		if (!controller)
			controller=getDefaultLoadController();
		control=controller;
		if (control)
			control->addToTracking(this);
	}

	LoadControlledObject(){
		control=getDefaultLoadController();
		if (control)
			control->addToTracking(this);
	}

	void setController(LoadController*controller){
		if (control)
			control->removeFromTracking(this);
		control=controller;
		if (control)
			control->addToTracking(this);
	}

	/***
	 * Удаляет себя из ведома контролера
	 * */
	~LoadControlledObject(){
		setController(0);
	}
};

#endif
